if (!window.RS) {
    var RS = function (R, key, params, beNull) {
        var a = key.split ('.'), o = R, i, last = a[a.length - 1], v, tmp;
        for (i = 0; i < a.length - 1; i ++) {
            if (a[i] in o) {
                o = o [a[i]];
            } else if (beNull) {
                return null;
            } else {
                return key;
            }
        }
        if (last in o) {
            v = $.trim (o [last]);
            if (v.indexOf ('${') >= 0) {
                if (params !== undefined) {
                    v = v.replace (/\$\{(.*?)\}/g, function (token) {
                        token = token.substr (2, token.length - 3);
                        if (token in params) {
                            return $.trim (params [token]);
                        } else {
                            tmp = RS (R, token, null, true);
                            if (tmp !== null) {
                                return tmp;
                            }
                        }
                        return token;
                    });
                } else {
                    v = v.replace(/\$\{(.*?)\}/g, function (token) {
                        token = token.substr(2, token.length - 3);
                        tmp = RS(R, token, null, true);
                        if (tmp !== null) {
                            return tmp;
                        }
                        return token;
                    });
                    // tmp = RS (R, token, null, true);
                    // if (tmp !== null) {
                    //     return tmp;
                    // }
                }
            }
/*
            if (params !== undefined && v.indexOf ('${') >= 0) {

            }
*/
            //
            return v;
        }
        return beNull ? null : key;
    }
}